input[type=radio]
radio都是用在只能單選一項的時候,監聽 change 事件。
因為 radio 只能單選一項,全部的 radio 都要綁定相同的 name,才能只選到一個,不然就會全部都能選到。
<div class="gender-content each-content">
<label for="gender">gender: </label>
<input type="radio" id="default" value="" disabled />
<label for="default">choose one</label>
<input
name="gender"
type="radio"
id="male"
value="male" />
<label for="male">male</label>
<input
name="gender"
type="radio"
id="female"
value="female" />
<label for="female">female</label>
<input
name="gender"
type="radio"
id="transgender"
value="transgender"/>
<label for="transgender">transgender</label>
</div>
<p></p>
let gender = '';
const male = document.querySelector('#male')
const female = document.querySelector('#female')
const transgender = document.querySelector('#transgender')
const textP = document.querySelector('p')
male.addEventListener('change', function () {
gerder = ''
gender = male.value;
textP.textContent = gender;
})
female.addEventListener('change', function () {
gerder = ''
gender = female.value
textP.textContent = gender;
})
transgender.addEventListener('change', function () {
gerder = ''
gender = transgender.value
textP.textContent = gender;
})
把同樣在原生裡面 name 的觀念套在 v-model 上的話就是每個 radio 的 v-model 都要是一樣的。
const gender = ref('')
<div class="gender-content each-content">
<label for="gender">gender: </label>
<input type="radio" id="default" value="" disabled />
<label for="default">choose one</label>
<input
type="radio"
id="male"
value="male"
v-model="gender" />
<label for="male">male</label>
<input
type="radio"
id="female"
value="female"
v-model="gender" />
<label for="female">female</label>
<input
type="radio"
id="transgender"
value="transgender"
v-model="gender" />
<label for="transgender">transgender</label>
<p>{{ gender }}</p>
</div>
這樣就不會發生那種怎麼每個都可以選的窘境拉XD
select
監聽 change 事件。
<select>
比較特別,他會包著一連串的 <option>
,select 本身是沒有 value的,是要看現在 option 選到哪一個,那個的value 就會變成 select 的 value。
<div class="flavor-content each-content">
<label for="flavor">flavor: </label>
<select name="flavor" id="flavor">
<option value="">--select flavor--</option>
<option value="chocolate">chocolate</option>
<option value="berry">berry</option>
<option value="banana">banana</option>
<option value="apple">apple</option>
<option value="vanilla">vanilla</option>
</select>
</div>
<p></p>
所以就只要拿到 flavor.value
再賦值給 p 就好了
const flavor = document.querySelector('#flavor')
const text = document.querySelector('p')
flavor.addEventListener('change', function() {
text.textContent = flavor.value;
})
我要哭了,程式碼有夠少,舒服
codepen: https://codepen.io/Jadddxx/pen/xxjQNQE?editors=1010
跟原生的一樣,所以 v-model 綁的位置是在 select
上,由他來決定 value 是什麼,而原生本來就會幫我們做到 選擇的 option 的 value 會給 select了,不必再選到 option 去拿 value。
這裡會用 v-for 來 renfer <option>
。
javscript:
const flavorText = ref('')
const flavorList = reactive([
"chocolate",
"berry",
"banana",
"apple",
"vanilla",
]);
template:
<div class="flavor-content each-content">
<label for="flavor">flavor: </label>
<select name="flavor" id="flavor" v-model="flavorText">
<option value="">--select flavor--</option>
<option v-for="flavor in flavorList" :value="flavor" :key="flavor">
{{ flavor }}
</option>
</select>
<p>{{ flavorText }}</p>
</div>
<select>
上<input type="text">
,<textarea>
綁定value值,響應式變數拿到的就是value的值<input type="checkbox">
<input type="radio">
<input name='gender'>
的name要一樣的,才會是一個單一選項。<select>
包著<option>
<select>
的value會隨著<option>
選到的值去改變,所以原始的<select>
value 就是空的,也不需要給他value。<select>
上,由選到哪一個 <option>
的value來決定。原本Vue的範例已經做好了,本來只是想大概說一下原生跟Vue的差別,然後原生用簡單的範例(例如一個的checkbox)的那種,後來想說跟Vue做一樣的才能比較啊,可是用原生的去做雙向綁定好麻煩啊~~code長的跟什麼一樣....
其實都是原生的東西不懂才不知道為什麼 v-model 要放在那個位置上啊~
快結束了ya
參考資料:
MDN input
MDN <select>
: The HTML Select element
Vue Form Input Bindings